﻿using SQ.BLL.Interfaces;
using SQ.Domain;
using SQ.Infrastructure.DataContexts;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQ.BLL.Implementation
{
    public class UsuarioBS : IUsuarioBS
    {
        private SmartQueueDataContext data = new SmartQueueDataContext();

        public void CriarUsuario(Usuario user)
        {
            if (user.IsValid())
            {
                try
                {
                    data.Usuarios.Add(user);
                    data.SaveChanges();
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format("Erro ao criar um novo usuario, motivo: {0}", ex.Message));
                }

            }
            else
            {
                throw new Exception("Usuário Inválido");
            }
        }

        public void AlterarUsuario(Usuario user)
        {
            if (user.IsValid())
            {
                try
                {

                    this.data.Entry(user).State = System.Data.Entity.EntityState.Modified;
                    
                    this.data.SaveChanges();
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format("Erro ao Alterar Usuário, motivo: {0}", ex.Message));
                }
            }
            else
            {
                throw new Exception("Usuário Inválido");
            }
        }

        public void ExcluirUsuario(int user)
        {

            try
            {
                if (user != 0)
                {
                    var usuario = this.data.Usuarios.FirstOrDefault(p => p.Id == user);
                    data.Set<Usuario>().Remove(usuario);
                    this.data.SaveChanges();
                }
                else
                {
                    throw new Exception("Usuário Inválido");
                }
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Erro ao excluir usuário, motivo: {0}", ex.Message));
            }

        }

        public ICollection<Usuario> ListarUsuarios()
        {
            try
            {
                return this.data.Usuarios.ToList();
            }
            catch (Exception ex)
            {
                string mensagem = string.Format("Mensagem: {0}, inner: {1}", ex.Message, ex.InnerException == null ? string.Empty : ex.InnerException.Message);
                throw new Exception(mensagem);
            }
        }


        public Usuario ListarUsuarios(string email)
        {
            try
            {
                if (string.IsNullOrEmpty(email))
                {
                    throw new ArgumentException("Email inválido");
                }

                Usuario retorno = this.data.Usuarios.FirstOrDefault(p => p.Email.Equals(email));
                return retorno;
            }
            catch (Exception ex)
            {

                string mensagem = string.Format("Mensagem: {0}, inner: {1}", ex.Message, ex.InnerException == null ? string.Empty : ex.InnerException.Message);
                throw new Exception(mensagem);
            }
        }
    }
}
